如果要在SFML建立視窗,要使用 sf::RenderWindow
並指定視窗的解析度以及標題,這樣就可以產生一個簡單的視窗,並且開始處理事件循環,以及繪製東西在螢幕上。
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
sf::RenderWindow
的第三個參數可以指定視窗的 Style:
sf::Style::None
sf::Style::Titlebar
sf::Style::Resize
sf::Style::Close
sf::Style::Fullscreen
sf::VideoMode
sf::Style::Default
Titlebar | Resize | Close
使用者與視窗互動時會產生事件(Event),如果不處理事件的化,整個視窗是不會有反應的,所以每個視窗 一定 要有處理事件的邏輯。
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
while (window.isOpen())
{
sf::Event event;
// 事件處裡,一定一定要有
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
}
SFML 有提供一些基本的視窗操作
// 設定視窗位置
window.setPosition(sf::Vector2i(10, 50));
// 顯示或隱藏視窗
window.setVisible(false);
// 更改大小
window.setSize(sf::Vector2u(640, 480));
// 設定標題
window.setTitle("SFML window");
// 查詢大小
sf::Vector2u size = window.getSize();
unsigned int width = size.x;
unsigned int height = size.y;
// 是否正使用
window.hasFocus() == true;
// 提示系統要求關注視窗
window.requestFocus();
// 顯示或隱藏滑鼠游標
window.setMouseCursorVisible(true);
// 限制滑鼠移動範圍
window.setMouseCursorGrabbed(true);
sf::VideoMode v = sf::VideoMode::getDesktopMode();
// v.width, v.height
// 開啟垂直同步
window.setVerticalSyncEnabled(true);
// 設定最高 fps
window.setFramerateLimit(60); // 使用不太準的 sf::Clock (+-10-15ms)
window.create(sf::VideoMode(800, 600), "test", sf::Style::Fullscreen);
這裡只列出常用的,其他設定請參考 Docs
SFML 支援多個建立窗口,但有一些限制:可以在不同的 thread,但獲取事件時一定要在窗口自己的 thread 上,建議的做法是用 main thread 管理窗口跟事件,然後其他例如:渲染、物理等,拿到其他 thread。
SFML 不像其他 GUI Library 提供許多窗口的功能,可以用 window.getSystemHandle()
來拿到底層的窗口 Handle,之後可以用 OS-Specific 的 function 做事
sf::WindowHandle handle = window.getSystemHandle();
// Use handle